package com.ayf.payment.game.api.utils;

import com.swwx.charm.commons.lang.utils.LogPortal;
import org.apache.commons.lang.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Random;

/**
 * @author admin
 * @Title: BigDecimalUtil
 * @Copyright: Copyright (c) 2019
 * @Description: <br>
 * @Company: 123.com
 * @Created on 2019/6/14下午11:56
 */
public final class BigDecimalUtil {

    private static final BigDecimal HUNDRED_AMT = BigDecimal.valueOf(100);

    /**
     * 分字符串转换为元字符串
     * @param feeStr
     * @return
     */
    public static String feeStrToYuanStr(String feeStr) {
        if (StringUtils.isEmpty(feeStr)) {
            return null;
        }
        try {
            return new BigDecimal(feeStr).multiply(BigDecimal.valueOf(0.01)).toString();
        } catch (Exception e) {
            LogPortal.error("分字符串转换为元字符串异常，分字符串是{}",e,feeStr);
            return null;
        }
    }


    /**
     * 分金额转换为元 保留2位小数点且四舍五入
     * @param feeAmt
     * @return
     */
    public static BigDecimal feeToYuanHalfUp(BigDecimal feeAmt) {
        if (feeAmt == null) {
            return null;
        }
        try {
            return (feeAmt.multiply(BigDecimal.valueOf(0.01))).setScale(2,BigDecimal.ROUND_HALF_UP);
        } catch (Exception e) {
            LogPortal.error("分金额转换为元金额异常，分金额是{}",e,feeAmt);
            return null;
        }
    }

    /**
     * 金额四舍五入
     * @param amt
     * @return
     */
    public static BigDecimal amtHalfUp(BigDecimal amt) {
        if (amt == null) {
            return null;
        }
        try {
            return amt.setScale(2,BigDecimal.ROUND_HALF_UP);
        } catch (Exception e) {
            LogPortal.error("金额四舍五入时发生异常，金额是{}",e,amt);
            return null;
        }
    }

    /**
     * 金额舍
     * @param amt
     * @return
     */
    public static BigDecimal amtHalfDown(BigDecimal amt) {
        if (amt == null) {
            return null;
        }
        try {
            return amt.setScale(2,BigDecimal.ROUND_HALF_DOWN);
        } catch (Exception e) {
            LogPortal.error("金额四舍五入时发生异常，金额是{}",e,amt);
            return null;
        }
    }

    /**
     * 获取最小最大区间的数值，不包含最大值
     * @param minAmt
     * @param maxAmt
     * @return
     */
    public static BigDecimal randomAmt(BigDecimal minAmt,BigDecimal maxAmt) {
        if (minAmt.compareTo(maxAmt)==0){
            return maxAmt;
        }
        int min = minAmt.multiply(BigDecimal.valueOf(10000)).intValue();
        int max = maxAmt.multiply(BigDecimal.valueOf(10000)).intValue()-1;
        int randomAmt = getRandom(min,max);
        return BigDecimal.valueOf(randomAmt).multiply(BigDecimal.valueOf(0.0001)).setScale(2,BigDecimal.ROUND_DOWN);
    }

    /**
     * 最小最大整数区间随机数值
     * @param min
     * @param max
     * @return
     */
    private static int getRandom(int min,int max) {
        Random random = new Random();
        int i = random.nextInt(max)%(max-min+1)+min;
        return i;
    }

    /**
     * 元转化为分，多余截断
     * @param yuanAmt
     * @return
     */
    public static BigDecimal yuanToFen(BigDecimal yuanAmt) {
        if (yuanAmt == null) {
            return null;
        }
        try {
            return (yuanAmt.multiply(HUNDRED_AMT)).setScale(0, RoundingMode.DOWN);
        } catch (Exception e) {
            LogPortal.error("元金额转换为分金额异常，元金额是{}",e,yuanAmt);
            return null;
        }
    }

    /**
     * 分转化为元保留2位小数，多余截断
     * @param feeAmt
     * @return
     */
    public static BigDecimal feeToYuanDown(BigDecimal feeAmt) {
        if (feeAmt == null) {
            return null;
        }
        try {
            return (feeAmt.multiply(BigDecimal.valueOf(0.01))).setScale(2,BigDecimal.ROUND_DOWN);
        } catch (Exception e) {
            LogPortal.error("分金额转换为元金额异常，分金额是{}",e,feeAmt);
            return null;
        }
    }

    /**
     * 字符串金额转换为BigDecimal类型
     * @param amtStr
     * @return
     */
    public static BigDecimal amtStrToBigdecimal(String amtStr) {
        if (StringUtils.isEmpty(amtStr)) {
            return BigDecimal.ZERO;
        }
        return new BigDecimal(amtStr);
    }

    public static void main(String[] args) {
        System.out.println(yuanToFen(BigDecimal.valueOf(100.28)));
    }
}
